const fs = require('fs');
const path = require('path');

class PerformanceAnalyzer {
    constructor() {
        this.statsPath = path.join(__dirname, 'dist', 'bundle-stats.json');
    }

    analyze() {
        try {
            if (!fs.existsSync(this.statsPath)) {
                console.log('❌ 未找到统计数据文件，请先运行: npm run webpack:profile');
                return;
            }

            const stats = JSON.parse(fs.readFileSync(this.statsPath, 'utf8'));
            this.printAnalysis(stats);
        } catch (error) {
            console.error('❌ 分析失败:', error.message);
        }
    }

    printAnalysis(stats) {
        console.log('\n🔥 Webpack 火焰图分析报告');
        console.log('=' .repeat(50));

        // 基本信息
        console.log('\n📊 基本信息:');
        console.log(`  构建时间: ${(stats.time / 1000).toFixed(2)}秒`);
        console.log(`  Webpack版本: ${stats.version}`);
        console.log(`  构建时间戳: ${new Date(stats.builtAt).toLocaleString()}`);

        // 资源分析
        console.log('\n📦 资源分析:');
        const totalSize = stats.assets.reduce((sum, asset) => sum + asset.size, 0);
        console.log(`  总包大小: ${(totalSize / 1024).toFixed(1)}KB`);
        console.log(`  资源文件数: ${stats.assets.length}`);

        // 模块性能分析
        console.log('\n⚡ 模块性能分析:');
        const modules = this.getModulesWithProfile(stats);
        const maxTime = Math.max(...modules.map(m => m.profile.total));

        modules.slice(0, 10).forEach((module, index) => {
            const percentage = (module.profile.total / maxTime) * 100;
            const bar = '█'.repeat(Math.floor(percentage / 5)) + '░'.repeat(20 - Math.floor(percentage / 5));
            
            console.log(`\n  ${index + 1}. ${this.getModuleDisplayName(module.name)}`);
            console.log(`     构建时间: ${module.profile.total}ms ${bar} ${percentage.toFixed(1)}%`);
            console.log(`     解析时间: ${module.profile.resolving}ms`);
            console.log(`     构建时间: ${module.profile.building}ms`);
            console.log(`     模块大小: ${(module.size / 1024).toFixed(1)}KB`);
        });

        // 性能建议
        console.log('\n💡 性能优化建议:');
        this.printOptimizationTips(stats, modules);
    }

    getModulesWithProfile(stats) {
        const modules = [];
        stats.chunks.forEach(chunk => {
            chunk.modules.forEach(module => {
                if (module.profile) {
                    modules.push(module);
                }
            });
        });
        return modules.sort((a, b) => b.profile.total - a.profile.total);
    }

    getModuleDisplayName(name) {
        return name.replace(/^\.\/node_modules\//, '📦 ')
                  .replace(/^\.\/src\//, '📁 ')
                  .replace(/\.(ts|js|css)$/, '')
                  .replace(/\./g, '/');
    }

    printOptimizationTips(stats, modules) {
        const tips = [];

        // 构建时间分析
        if (stats.time > 10000) {
            tips.push('🚨 构建时间过长 (>10s)，建议启用缓存和并行处理');
        }

        // 慢模块分析
        const slowModules = modules.filter(m => m.profile.total > 1000);
        if (slowModules.length > 0) {
            tips.push(`🐌 发现 ${slowModules.length} 个慢模块 (>1s)，建议优化`);
        }

        // 解析时间分析
        const highResolveTime = modules.filter(m => m.profile.resolving > 500);
        if (highResolveTime.length > 0) {
            tips.push('🔍 部分模块解析时间较长，建议检查依赖关系');
        }

        // 通用建议
        tips.push('💾 启用 webpack 缓存: cache: { type: "filesystem" }');
        tips.push('⚡ 使用 thread-loader 进行并行处理');
        tips.push('📦 考虑代码分割减少初始包大小');
        tips.push('🔄 使用 webpack 5 的模块联邦进行微前端优化');

        tips.forEach((tip, index) => {
            console.log(`  ${index + 1}. ${tip}`);
        });
    }
}

// 运行分析
const analyzer = new PerformanceAnalyzer();
analyzer.analyze(); 